package funcs

import (
	"github.com/toolkits/nux"
	"sync"
)

// 保留多少轮历史数据
const (
	historyCount int = 2
)


var (
	procStatHistory [historyCount]*nux.ProcStat // 存放 cpu 历史数据
	psLock          = new(sync.RWMutex)         // 锁
)

//更新 cpu 状态
func UpdateCpuStat() error {

	// 读取 /proc/stat 文件 /proc/stat这个文件记录了开机以来的cpu使用信息
	ps, err := nux.CurrentProcStat()
	if err != nil {
		return err
	}

	psLock.Lock()
	defer psLock.Unlock()

	// 抛弃过期的历史数据，给新数据腾出位置
	for i := historyCount - 1; i > 0; i-- {
		procStatHistory[i] = procStatHistory[i-1]
	}

	procStatHistory[0] = ps // 保存最新数据
	return nil
}

func deltaTotal() uint64 {
	if procStatHistory[1] == nil {
		return 0
	}
	return procStatHistory[0].Cpu.Total - procStatHistory[1].Cpu.Total
}

func CpuIdle() float64 {
	psLock.RLock()
	defer psLock.RUnlock()
	dt := deltaTotal()
	if dt == 0 {
		return 0.0
	}
	invQuotient := 100.00 / float64(dt)
	return float64(procStatHistory[0].Cpu.Idle-procStatHistory[1].Cpu.Idle) * invQuotient
}
